#include<iostream>
#include<signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


// void hand(int sig)
// {
//     std::cout << "sig:" << sig << "pid:" << getpid() << std::endl;
//     while(true)//循环回收10个子进程
//     {
//         pid_t rid = ::waitpid(-1,nullptr,WNOHANG);//回收子进程---加WNOHANG，不阻塞等待，回收完后返回0
//         if(rid > 0)//等待成功
//         {
//             std::cout << "子进程退出了,回收成功，rid:" << rid << std::endl;
//         }
//         else if(rid == 0)
//         {
//             std::cout << "退出的子进程已经被全部回收了" << std::endl;
//             break;
//         }
//         else
//         {
//             std::cout << "等待错误" << std::endl;
//             break;
//         }
//     }
// }

//1/验证子进程退出，给父进程发送SIGCHLD
//2.我们可不可以基于信号进行子进程回收呢？
int main()
{
    //signal(SIGCHLD,hand); 
    //将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的⼦进程在终⽌时会⾃动清理掉
    ::signal(SIGCHLD,SIG_IGN);
    //创建10个子进程
    for(int i=0;i<10;i++)
    {
        if(fork() == 0)
        {
            sleep(5);
            std::cout << "子进程退出" << std::endl;
            //子进程

            exit(1);
        } 
    }

    while(true)
    {
        sleep(1);
    }

    return 0;
}